/**
 * 用户保持表
 */
#pragma once

#include "EventType.h"

/* 用户保持表对象 */
typedef struct _KeepTable KeepTable;
#define KEEP_TABLE(any) ((KeepTable *)any)

extern KeepTable *keep_table_new(void);

/**
 * 从 onlineID 获得一条用户 UserID。
 * 首先判断用户是否在线，若不在线则返回 0
 */
extern euint32 keep_table_get_uid_from_oid(KeepTable *self, euint64 oid);

/**
 * 验证一条 onlineID 是否存在
 * @return true: 存在，false: 不存在
 */
extern bool keep_table_verify_existed_online_id(KeepTable *self, euint64 oid);

/**
 * 判断用户登陆是否在时限之内
 * @return 0: 处于登陆有效期，1: 需要重新无验证码登陆，2: 需要重新带验证码登陆
 */
extern int keep_table_verify_logon_state(KeepTable *self, euint64 oid);

/**
 * 根据 onlineID 刷新一条保持表条目状态
 * 用户的在线状态设置为在线。
 * @param only_flush_ktime 只刷新保持时间
 * @return 0: 成功，1: 未找到相关用户，2: 空对象错误
 */
extern int keep_table_flush_online_state(KeepTable *self, euint64 online_id,
					 bool only_flush_ktime);

/**
 * 增加一条用户保持记录，注意，若该 onlineID 已存在则将无任何操作！
 */
extern void keep_table_add_online_item(KeepTable *self, euint64 online_id,
				       euint32 user_id);

/**
 * 移除一条用户保持记录。若 onlineID 不存在则不进行任何操作。
 */
extern void keep_table_remove_online_item(KeepTable *self, euint64 online_id);

/**
 * 添加一条用户保持记录
 */
extern void __keep_table_add_log(KeepTable *keep_table, euint64 online_id,
				 euint32 user_id);

/**
 * 打印用户保持记录
 */
extern void __keep_table_print(KeepTable *keep_table);
